package com.wzw.basics.concurrent.util;

import java.lang.ref.WeakReference;

/**
 * 线程本地变量
 * 会在每个线程都创建一个副本，那么在线程之间访问内部
 * 副本变量就行了，做到了线程之间互相隔离，相比于synchronized的做法是用空间来换时间
 * <p>
 * 内存泄露：使用完成后必须手动remove
 *
 * @author Wangzhiwen
 */
public class ThreadLocalDemo {

    private static final ThreadLocal<String> LOCAL = new InheritableThreadLocal<String>() {
        @Override
        public String get() {
            return "init";
        }
    };

    public static void set(String var) {
        LOCAL.set(var);
    }

    public static String get() {
        return LOCAL.get();
    }

    public static void remove() {
        LOCAL.remove();
    }

    public static void main(String[] args) {
        // 不手动remove会有内存泄露的问题，原因就是内部用户存储变量的对象是弱引用，但是只有key是，varlue不是
/*        static class Entry extends WeakReference<ThreadLocal<?>> {
            Object value;

            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }*/
    }

}
